#include "LiteMiddle.h"

//////////////////////////////////////////////////////////////////////////////////////////////////
/////////静态函数——AT接收解析的钩子函数注册
static u8 LITEAT_OnRecv_AT(u8 *ucpRecvonse,u16 ucpSize); //AT解析
static u8 LITEAT_Recv_Echo(u8 *ucpRecvonse,u16 ucpSize);  //ECHO解析
/////////静态函数——AT接收解析的钩子函数注册
/////////静态函数——AT发送前的钩子函数注册
static u8 LITEAT_PreSend_AT(BUFFER_T *pBuf,u8 *pFormatStr,u8* pParamter);      //AT预处理
/////////静态函数——AT发送前的钩子函数注册
//////////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////静态AT命令/////////////////////////////////////////////////////
LITEAT_CMD_T   g_AtCmds[] =
//命令ID  ，发送的字符串      ，期望响应字符串，发送后延时(ms)，超时延时(ms)，重试次数，发送前钩子  ，响应解析钩子，失败后钩子
{ 
  {0},
  {AT      ,"AT\r\n\0"             ,"OK"             ,100          ,500          ,3        ,LITEAT_PreSend_AT         ,LITEAT_OnRecv_AT,NULL        } ,
  {ECHO    ,"ATE%d\r\n\0"          ,"OK"             ,100          ,500          ,3        ,NULL                      ,LITEAT_Recv_Echo ,NULL         },
  {0}
};
/////////////////////////////////////////////静态AT命令/////////////////////////////////////////////////////

/////////////////////////////////////////////URC/////////////////////////////////////////////////////
//  URC topic 回调处理
typedef struct
{
  u8 *pUrcCmd;  //  模块传回的URC命令
  void (*pFunUrcCallback)(LITEAT_T *tpAt);  //  匹配成功后的回调
}AT_URC_T;

//  URC回调钩子：收到ready
static void LITEAT_UrcCallback_ready(LITEAT_T *tpAt)
{
//  SET_FLAG(tpAt->NetWorkStatus,LITEAT_NETSTATUS_AT);  //  设置状态位
  return;
}
//  URC回调钩子：收到WIFI CONNECTED
static void LITEAT_UrcCallback_WIFIGOTIP(LITEAT_T *tpAt)
{
//  SET_FLAG(tpAt->NetWorkStatus,LITEAT_NETSTATUS_WIFI);  //  设置状态位
  return;
}

//  URC数据
const static AT_URC_T tpaAtUrc[] =
{
  {"ready",LITEAT_UrcCallback_ready},
  {"WIFI CONNECTED",NULL},
  {"WIFI GOT IP",LITEAT_UrcCallback_WIFIGOTIP},
  {NULL,NULL}
};
//  解析URC消息
static void LITEAT_UrcParse(u8 *data,u16 size)
{
  u8 index=0;
  //  step：命令匹配阶段
  while (tpaAtUrc[index].pUrcCmd!=NULL) 
  {
    if(strstr((char *)data,(char *)(tpaAtUrc[index].pUrcCmd)))
    {
      break;  //  匹配成功则退出
    }
    index++;
  }

  //  step：执行回调
  if(tpaAtUrc[index].pUrcCmd!=NULL)
  {
    //  执行回调
    if(tpaAtUrc[index].pFunUrcCallback!=NULL)
    {
      tpaAtUrc[index].pFunUrcCallback(&g_tAtHandler);
    }
    LITE_LOG_Write("UrcSuccess\r\n",strlen("UrcSuccess\r\n"));
    return;     //  退出
  }
  LITE_LOG_Write("UrcFailed\r\n",strlen("UrcFailed\r\n"));
  return;
}
//  AT主动回传消息处理
void LITE_ATRECV_UrcProecess(u8 *data,u16 size)
{
  LITEAT_UrcParse(data,size);
  return;
}
/////////////////////////////////////////////URC/////////////////////////////////////////////////////


//////////////////////////////////////////////AT接收解析////////////////////////////////////////////////////
/////////静态函数——AT接收解析的钩子函数实现
//"AT"命令解析：
static u8 LITEAT_OnRecv_AT(u8 *ucpRecvonse,u16 ucpSize)
{
  //匹配成功
  if (strstr((char *)ucpRecvonse,(char *)g_AtCmds[AT].ExpRecStr)) 
  {
    SET_FLAG(g_tEsp32.state,ESP32_STATEBIT_PRESETN);  //  置位ESP32模块在线标记
    return ATRECV_RET_OK;
  }
 
  CLEAR_FLAG(g_tEsp32.state,ESP32_STATEBIT_PRESETN);  //  复位ESP32模块在线标记
  //匹配失败
  return ATRECV_RET_NOMATCH;
};

//"ECHO"解析
static u8 LITEAT_Recv_Echo(u8 *ucpRecvonse,u16 ucpSize)
{
  //匹配成功
  if (strstr((char *)ucpRecvonse,(char *)g_AtCmds[AT].ExpRecStr)) 
  {
    SET_FLAG(g_tEsp32.state,ESP32_STATEBIT_ECHO);  //  置位ESP32模块回显关闭标记
    return ATRECV_RET_OK;
  }
  CLEAR_FLAG(g_tEsp32.state,ESP32_STATEBIT_ECHO);  //  复位ESP32模块回显关闭标记  
  //匹配失败
  return ATRECV_RET_NOMATCH;
}
/////////静态函数——AT接收解析的钩子函数实现
//////////////////////////////////////////////AT接收解析////////////////////////////////////////////////////

//////////////////////////////////////////////AT发送预处理////////////////////////////////////////////////////
//  发送前处理:AT
static u8 LITEAT_PreSend_AT(BUFFER_T *pBuf,u8 *pFormatStr,u8* pParamter)
{
  if(BUF_Write_Format(pBuf,(char *)pFormatStr,pParamter))
    return  AT_RET_OK;

  return  AT_RET_ERROR;
}
//////////////////////////////////////////////AT发送预处理////////////////////////////////////////////////////
/***************************** LiteBsp by Miaozi (END OF FILE) *********************************/

